package api

import (
	"strconv"

	"github.com/gin-gonic/gin"

	"ppp/internal/models"
	"ppp/internal/services"
)

// NewsHandler 新闻处理器
type NewsHandler struct {
	newsService services.NewsService
}

// NewNewsHandler 创建新的新闻处理器
func NewNewsHandler() *NewsHandler {
	return &NewsHandler{
		newsService: services.NewNewsService(),
	}
}

// RegisterRoutes 注册新闻相关路由
func (h *NewsHandler) RegisterRoutes(router *gin.Engine) {
	newsGroup := router.Group("/api/news")
	{
		newsGroup.POST("", h.CreateNews)       // 创建新闻
		newsGroup.GET("", h.ListNews)         // 获取新闻列表
		newsGroup.GET("/:id", h.GetNews)       // 获取新闻详情
		newsGroup.PUT("/:id", h.UpdateNews)    // 更新新闻信息
		newsGroup.DELETE("/:id", h.DeleteNews) // 删除新闻
	}
}

// CreateNews 创建新闻
func (h *NewsHandler) CreateNews(c *gin.Context) {
	var req models.CreateNewsRequest

	// 绑定请求体
	if err := c.ShouldBindJSON(&req); err != nil {
		ValidationError(c, err.Error())
		return
	}

	// 通过服务层创建新闻
	news, err := h.newsService.CreateNews(&req)
	if err != nil {
		InternalServerError(c, "创建新闻失败: "+err.Error())
		return
	}

	// 返回成功响应
	Created(c, news.ToResponse())
}

// GetNews 获取新闻详情
func (h *NewsHandler) GetNews(c *gin.Context) {
	// 获取路径参数并转换为uint
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		BadRequest(c, "无效的新闻ID")
		return
	}

	// 通过服务层获取新闻
	news, err := h.newsService.GetNewsByID(uint(id))
	if err != nil {
		if err.Error() == "新闻不存在" {
			NotFound(c, "新闻不存在")
		} else {
			InternalServerError(c, "查询新闻失败: "+err.Error())
		}
		return
	}

	// 返回成功响应
	Success(c, news.ToResponse())
}

// UpdateNews 更新新闻信息
func (h *NewsHandler) UpdateNews(c *gin.Context) {
	// 获取路径参数并转换为uint
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		BadRequest(c, "无效的新闻ID")
		return
	}

	var req models.UpdateNewsRequest
	// 绑定请求体
	if err := c.ShouldBindJSON(&req); err != nil {
		ValidationError(c, err.Error())
		return
	}

	// 通过服务层更新新闻
	news, err := h.newsService.UpdateNews(uint(id), &req)
	if err != nil {
		if err.Error() == "新闻不存在" {
			NotFound(c, "新闻不存在")
		} else {
			InternalServerError(c, "更新新闻失败: "+err.Error())
		}
		return
	}

	// 返回成功响应
	Success(c, news.ToResponse())
}

// DeleteNews 删除新闻
func (h *NewsHandler) DeleteNews(c *gin.Context) {
	// 获取路径参数并转换为uint
	idStr := c.Param("id")
	id, err := strconv.ParseUint(idStr, 10, 32)
	if err != nil {
		BadRequest(c, "无效的新闻ID")
		return
	}

	// 通过服务层删除新闻
	err = h.newsService.DeleteNews(uint(id))
	if err != nil {
		if err.Error() == "新闻不存在" {
			NotFound(c, "新闻不存在")
		} else {
			InternalServerError(c, "删除新闻失败: "+err.Error())
		}
		return
	}

	// 返回成功响应
	SuccessWithMessage(c, "新闻删除成功", nil)
}

// ListNews 获取新闻列表
func (h *NewsHandler) ListNews(c *gin.Context) {
	// 通过服务层获取新闻列表
	newsList, err := h.newsService.ListNews()
	if err != nil {
		InternalServerError(c, "查询新闻列表失败: "+err.Error())
		return
	}

	// 转换为响应格式
	responses := make([]models.NewsResponse, 0, len(newsList))
	for _, news := range newsList {
		responses = append(responses, news.ToResponse())
	}

	// 返回成功响应
	Success(c, responses)
}